/*
 * @Author: January
 * @Date: 2021-03-03 21:29:04
 */
#ifndef SECRYPTO_DEF_H
#define SECRYPTO_DEF_H

#ifdef __cplusplus
extern "C"
{
#endif
/**
 * 算法标识定义
 */
#define SEC_UNDEFINE 0xffffffff
#define SEC_SIZE_KEY_ID 16

// 消息摘要算法
#define SEC_SM3 0x01000001

// 消息认证码算法
#define SEC_HMAC_WITH_SM3 0x02000001

// 对称密码算法
// | type: 0x03 | auth | unused | encryption algo |
// auth为0x00表示无认证加密（普通加密操作，不生成认证码）
// auth为0x01表示专用的AEAD模式（如GCM/CCM等AEAD模式）
// auth >= 0x02表示加密 + HMAC组合认证加密模式
#define SEC_SM4_CBC 0x03000001
#define SEC_SM4_CBC_HMAC_SM3 0x03010001
#define SEC_SM4_CTR 0x03000002
#define SEC_SM4_CTR_HMAC_SM3 0x03010002

// 公钥签名算法
#define SEC_SM2_SIG_WITH_SM3 0x04000001
// 公钥加密算法
#define SEC_SM2_ENC_WITH_SM3 0x04000002

// 密钥派生算法
#define SEC_HKDF_WITH_SM3 0x00000001
#define SEC_PBKDF2_WITH_SM3 0x00000002
#define SEC_X963KDF_WITH_SM3 0x00000003


/**
 * 密钥类型定义
 */

// 通用密钥, 即没有结构的随机字节
#define SEC_KEY_GENERIC 0x00000001
// ECC公钥
#define SEC_KEY_SM2_PUBKEY 0x00000002
// ECC私钥
#define SEC_KEY_SM2_PRIVKEY 0x00000003
// 通用类型公钥(subjectkeyinfo)
#define SEC_KEY_SUBPUBKEY 0x00000004
// 通用类型私钥
#define SEC_KEY_PKCS8 0x00000005

/**
 * 错误码定义
 */
#define SECRYPTO_EQUAL 0
#define SECRYPTO_OK 0
#define SECRYPTO_ERR_INVALID_PARAM -1

// 和mbedtls的接口
#define MBEDTLS_EQUAL 0

typedef unsigned int uint32_t;
uint32_t secrypto_str_to_key_type(const char* key_type_str);
const char* secrypto_key_type_to_str(uint32_t key_type);
uint32_t secrypto_str_to_cipher_type(const char* type_str);
const char* secrypto_cipher_type_to_str(uint32_t type);
uint32_t secrypto_str_to_mac_type(const char* type_str);
const char* secrypto_mac_type_to_str(uint32_t type);
uint32_t secrypto_str_to_pkey_enc_type(const char* type_str);
const char* secrypto_pkey_enc_type_to_str(uint32_t type);
uint32_t secrypto_str_to_pkey_sign_type(const char* type_str);
const char* secrypto_pkey_sign_type_to_str(uint32_t type);
#ifdef __cplusplus
}
#endif
#endif /* def.h */
